package com.bbva.kyfb.kyfbbofi.pau;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.bbva.jee.arq.spring.core.gce.ExcepcionEjecucionAplicacion;
import com.bbva.jee.arq.spring.core.log.I18nLog;
import com.bbva.jee.arq.spring.core.log.I18nLogFactory;
import com.bbva.jee.arq.spring.core.util.excepciones.PropiedadNoEncontradaExcepcion;
import com.bbva.kyfb.kyfbdaofi.IValidadorPAU;
import com.bbva.kyfb.kyfbdto.firmas.bo.DatosPAU;
import com.bbva.kyfb.kyfbdto.firmas.errores.Errores_kyfb_servicios;
import com.bbva.kyfb.kyfbutils.errores.ValidationUtils;
import com.bbva.kyfb.kyfbutils.pau.ConstantesPAU;

/**
 * The Class SrvAutenticadorPAU.
 */
@Component(value = "srvAutenticadorPAU")
public class SrvAutenticadorPAU implements ISrvAutenticacionPAU {
	/** Variable LOG. */
	private static final I18nLog LOG = I18nLogFactory.getLogI18n(SrvAutenticadorPAU.class);
	/** The validador pau. */
	@Autowired
	private IValidadorPAU validadorPAU;
	/** {@inheritDoc}
	 * @see com.bbva.kyfb.kyfbbofi.pau.ISrvAutenticacionPAU#autenticarPAU(com.bbva.kyfb.kyfbdto.firmas.bo.DatosPAU)
	 */
	@Override
	public String autenticarPAU(final DatosPAU datosPAU) throws ExcepcionEjecucionAplicacion  {
		//Se debe comprobar si el token está asignado a ese usuario
		//Se realiza la llamada al webservice
		final List<String> datosBasicos = validadorPAU.validacionesToken(datosPAU.getsReferencia(), datosPAU.getsCanal(), Integer.valueOf(datosPAU.getsBancoInt()),
				Integer.valueOf(datosPAU.getsBancoProducto()), Integer.valueOf(datosPAU.getsProductoServicio()), Integer.valueOf(datosPAU.getsCodSubProducto()), datosPAU.getsCodUsuario());
		//TODO Mientras falle el front recogemos el mismo token que nos venga para que puedan continuar
		datosPAU.setsTokenFisico(datosBasicos.get(0));
		//Comparamos que el token del usuario si es el mismo del que nos pasan
		if (!datosBasicos.get(0).equals(datosPAU.getsTokenFisico().trim())) {
			//si no coincide el token del ws con el que nos pasan devolvemos error
			LOG.error("SrvAutenticadorPAU.autenticarPAU - Error de token. El token no es el que tiene asignado el usuario.");
			throw new ExcepcionEjecucionAplicacion(Errores_kyfb_servicios.SERVICIO_NO_DISPONIBLE);
		}
		//Segun el tipo de validacion que nos pasen se hace una cosa u otra
		final String tipoValidacion = datosPAU.getsTipoValidacion();
		final String resp;
		if (tipoValidacion.equalsIgnoreCase(ConstantesPAU.SECUENCIA_CLAVEOP)) {
			resp = validadorPAU.validaClaveOperaciones(datosPAU, datosPAU.getsPasswordUsuario());
		} else if (tipoValidacion.equalsIgnoreCase(ConstantesPAU.SECUENCIA_CLAVEOP_OTP)) {
			resp = validadorPAU.validaCLOPSMS(datosPAU.getsIdSession(), datosPAU.getsPasswordFisico(), datosPAU, datosPAU.getsPasswordUsuario());
		} else if (tipoValidacion.equalsIgnoreCase(ConstantesPAU.SECUENCIA_CLAVEOP_VASCO)) {
			resp = validadorPAU.validaClaveOperacionesVasco(datosPAU.getsTokenFisico(), datosPAU.getsPasswordFisico(), datosPAU, datosPAU.getsPasswordUsuario());
		} else if (tipoValidacion.equalsIgnoreCase(ConstantesPAU.SECUENCIA_CLAVEOP_VASCO_CMP)) {
			//Si es un usuario CMP el usuario del token puede ser distinto del que nos estan pasando
			datosPAU.setsCodUsuario(datosBasicos.get(3).trim());
			resp = validadorPAU.validaClaveOperacionesVascoCMP(datosPAU.getsTokenFisico(), datosPAU.getsPasswordFisico(), datosPAU, datosPAU.getsPasswordUsuario());
		} else if (tipoValidacion.equalsIgnoreCase(ConstantesPAU.SECUENCIA_FORMULA)) {
			resp = validadorPAU.validaFORMULA(datosPAU, datosPAU.getsPasswordUsuario(), datosPAU.getsNumeroAleatorio());
		} else if (tipoValidacion.equalsIgnoreCase(ConstantesPAU.SECUENCIA_FORMULA_OTP)) {
			resp = validadorPAU.validaFORMULAOTP(datosPAU, datosPAU.getsIdSession(), datosPAU.getsPasswordFisico(), datosPAU.getsPasswordUsuario(), datosPAU.getsNumeroAleatorio());
		} else if (tipoValidacion.equalsIgnoreCase(ConstantesPAU.SECUENCIA_FORMULA_VASCO)) {
			resp = validadorPAU.comprobarFormulaOTP(datosPAU.getsTokenFisico(), datosPAU.getsPasswordFisico(), datosPAU.getsPasswordUsuario(), datosPAU.getsNumeroAleatorio(), datosPAU);
		} else {
			LOG.error("SrvAutenticadorPAU.autenticarPAU - Error de parámetros. El parametro sTipoValidacion no está contemplado.");
			throw new ExcepcionEjecucionAplicacion(Errores_kyfb_servicios.CREDENCIALES_INCORRECTAS);
		}
		return resp;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public String enviaNotificacion(final DatosPAU datosPAU) throws ExcepcionEjecucionAplicacion, PropiedadNoEncontradaExcepcion  {
		final Object[] obligatorios = new Object[]{datosPAU, datosPAU.getsTipoValidacion(), datosPAU.getsCanal(), datosPAU.getsBancoInt(),
				datosPAU.getsReferencia(), datosPAU.getsCodUsuario(), datosPAU.getsTelefono()};
		ValidationUtils.validarObligatorios(obligatorios, Errores_kyfb_servicios.CAMPO_OBLIGATORIO_NO_INFORMADO, true);
		//Segun el tipo de validacion que nos pasen se hace una cosa u otra
		if (ConstantesPAU.SECUENCIA_CLAVEOP_OTP.equalsIgnoreCase(datosPAU.getsTipoValidacion())) {
			return validadorPAU.enviaCLOPSMS(datosPAU.getsTelefono(), datosPAU.getsMensaje(), datosPAU);
		} else if (ConstantesPAU.SECUENCIA_FORMULA_OTP.equalsIgnoreCase(datosPAU.getsTipoValidacion())) {
			return validadorPAU.enviaFORMULAOTP(datosPAU.getsTelefono(), datosPAU.getsMensaje(), datosPAU);
		} else {
			LOG.error("SrvAutenticadorPAU.enviaNotificacion - Error de parámetros. El parametro sTipoValidacion no está contemplado.");
			throw new ExcepcionEjecucionAplicacion(Errores_kyfb_servicios.CREDENCIALES_INCORRECTAS);
		}
	}
}
